//////////////////////////
// Stimulus Information //
//////////////////////////
VVDD (VDD 0) vsource dc=pvdd
VVSS (VSS 0) vsource dc=0
VVSC (CLK 0) vsource dc=0

VVN0 (IN 0)  vsource type=pulse val0=0 val1=pvdd period=500m delay=0n

///////////////////////
// Top Level Circuit //
///////////////////////

// comment out muxProg16 (connection boxes) for now
//I0  (N0 N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 N11 N12 N13 N14 N15 n0 VDD VSS) muxProg16
//I1  (E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 E10 E11 E12 E13 E14 E15 n1 VDD VSS) muxProg16
//I2  (S0 S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 S15 n2 VDD VSS) muxProg16
//I3  (W0 W1 W2 W3 W4 W5 W6 W7 W8 W9 W10 W11 W12 W13 W14 W15 n3 VDD VSS) muxProg16
//I4  (N0 N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 N11 N12 N13 N14 N15 n4 VDD VSS) muxProg16
//I5  (E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 E10 E11 E12 E13 E14 E15 n5 VDD VSS) muxProg16
//I6  (S0 S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 S15 n6 VDD VSS) muxProg16
//I7  (W0 W1 W2 W3 W4 W5 W6 W7 W8 W9 W10 W11 W12 W13 W14 W15 n7 VDD VSS) muxProg16
//I8  (N0 N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 N11 N12 N13 N14 N15 n8 VDD VSS) muxProg16
//I9  (E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 E10 E11 E12 E13 E14 E15 n9 VDD VSS) muxProg16
//I10 (S0 S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 S15 nA VDD VSS) muxProg16
//I11 (W0 W1 W2 W3 W4 W5 W6 W7 W8 W9 W10 W11 W12 W13 W14 W15 nB VDD VSS) muxProg16
//I12 (N0 N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 N11 N12 N13 N14 N15 nC VDD VSS) muxProg16
//I13 (E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 E10 E11 E12 E13 E14 E15 nD VDD VSS) muxProg16

I14 (n0 n1 n2 n3 n4 n5 n6 n7 n8 n9 nA nB nC nD CLK VDD VSS) clb

// Input & Output Load
B0 (IN tmp VDD VSS) inv1b1s
B1 (tmp n0 VDD VSS) inv1b1s
//C0 (nD VSS) capacitor c=28f

/////////////////////////
// Subcell Definitions //
/////////////////////////
// Cell name: clb
subckt clb D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 Qa Qb Qc Qd CLK VDD VSS
    I0  (D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 Qa Qb Qc Qd VSS VDD n0  VDD VSS) muxProg16
    I1  (D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 Qa Qb Qc Qd VSS VDD n1  VDD VSS) muxProg16
    I2  (D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 Qa Qb Qc Qd VSS VDD n2  VDD VSS) muxProg16
    I3  (D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 Qa Qb Qc Qd VSS VDD n3  VDD VSS) muxProg16
    I4  (D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 Qa Qb Qc Qd VSS VDD n4  VDD VSS) muxProg16
    I5  (D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 Qa Qb Qc Qd VSS VDD n5  VDD VSS) muxProg16
    I6  (D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 Qa Qb Qc Qd VSS VDD n6  VDD VSS) muxProg16
    I7  (D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 Qa Qb Qc Qd VSS VDD n7  VDD VSS) muxProg16
    I8  (D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 Qa Qb Qc Qd VSS VDD n8  VDD VSS) muxProg16
    I9  (D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 Qa Qb Qc Qd VSS VDD n9  VDD VSS) muxProg16
    I10 (D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 Qa Qb Qc Qd VSS VDD n10 VDD VSS) muxProg16
    I11 (D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 Qa Qb Qc Qd VSS VDD n11 VDD VSS) muxProg16
    I12 (D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 Qa Qb Qc Qd VSS VDD n12 VDD VSS) muxProg16
    I13 (D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 Qa Qb Qc Qd VSS VDD n13 VDD VSS) muxProg16
    I14 (D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 Qa Qb Qc Qd VSS VDD n14 VDD VSS) muxProg16
    I15 (D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 Qa Qb Qc Qd VSS VDD n15 VDD VSS) muxProg16
    I16 (n0 n1 n2 n3 n4 n5 n6 n7 n8 n9 n10 n11 n12 n13 n14 n15 Qa Qb Qc Qd CLK VDD VSS) cluster
ends clb

// Cell name: cluster
subckt cluster A0 A1 A2 A3 B0 B1 B2 B3 C0 C1 C2 C3 D0 D1 D2 D3 Qa Qb Qc Qd CLK VDD VSS
    I0 (CLK Qa A0 A1 A2 A3 VDD VSS) ble4
    I1 (CLK Qb B0 B1 B2 B3 VDD VSS) ble4
    I2 (CLK Qc C0 C1 C2 C3 VDD VSS) ble4
    I3 (CLK Qd D0 D1 D2 D3 VDD VSS) ble4
ends cluster

// Cell name: ble4
subckt ble4 CLK Q S0 S1 S2 S3 VDD VSS
    I0 (n0  S0 S1  S2  S3 VDD VSS) lut4
    I1 (CLK n0 n1  VDD VSS) dFF
    I2 (n0  n1 n2  VDD VSS) muxProg2
    I3 (n2 Q VDD VSS) buff
ends ble4

// Cell name: lut4
subckt lut4 Q S0 S1 S2 S3 VDD VSS
    I0 (n0a n1a n2a n3a n4a n5a n6a n7a n8a n9a n10a n11a n12a n13a n14a n15a VDD VSS) reg16b
    I1 (n0a n1a n2a  n3a  n4a  n5a  n6a  n7a  n0q n1q n2q  n3q  n4q  n5q  n6q  n7q  VDD VSS) buff8
    I2 (n8a n9a n10a n11a n12a n13a n14a n15a n8q n9q n10q n11q n12q n13q n14q n15q VDD VSS) buff8
    I3 (n0q n1q n2q n3q n4q n5q n6q n7q n8q n9q n10q n11q n12q n13q n14q n15q Q S0 S1 S2 S3 VDD VSS) mux16
ends lut4

// Cell name: dFF
subckt dFF CLK D Q VDD VSS
    inv (CLK CLKb VDD VSS) inv1b1s
    dL0 (CLKb CLK  D  n0 VDD VSS) dLatch
    dL1 (CLK  CLKb n0 Q  VDD VSS) dLatch
ends dFF

// Cell name: dLatch
subckt dLatch CLK CLKb D Q VDD VSS
    inv0 (n0 Q  VDD VSS) inv1b1s
    inv1 (Q  n1 VDD VSS) inv1b1s
    tx0  (D  CLKb CLK  n0 VDD VSS) transGate
    tx1  (n1 CLK  CLKb n0 VDD VSS) transGate
ends dLatch

// Cell name: reg16b
subckt reg16b D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 VDD VSS
    r0  (VSS D0  n0  VDD VSS VSS) BX
    r1  (VSS D1  n1  VDD VSS VSS) BX
    r2  (VSS D2  n2  VDD VSS VSS) BX
    r3  (VSS D3  n3  VDD VSS VSS) BX
    r4  (VSS D4  n4  VDD VSS VSS) BX
    r5  (VSS D5  n5  VDD VSS VSS) BX
    r6  (VSS D6  n6  VDD VSS VSS) BX
    r7  (VSS D7  n7  VDD VSS VSS) BX
    r8  (VSS D8  n8  VDD VSS VSS) BX
    r9  (VSS D9  n9  VDD VSS VSS) BX
    r10 (VSS D10 n10 VDD VSS VSS) BX
    r11 (VSS D11 n11 VDD VSS VSS) BX
    r12 (VSS D12 n12 VDD VSS VSS) BX
    r13 (VSS D13 n13 VDD VSS VSS) BX
    r14 (VSS D14 n14 VDD VSS VSS) BX
    r15 (VSS D15 n15 VDD VSS VSS) BX
ends reg16b

// Cell name: mux2
subckt mux2 A B Q S Sb VDD VSS
    I0 (B S  Sb Q VDD VSS) transGate
    I1 (A Sb S  Q VDD VSS) transGate
ends mux2

// Cell name: mux4
subckt mux4 D0 D1 D2 D3 Q S0 S0b S1 S1b VDD VSS
    I0 (D2 D3 n0 S0 S0b VDD VSS) mux2
    I1 (D0 D1 n1 S0 S0b VDD VSS) mux2
    I2 (n1 n0 Q  S1 S1b VDD VSS) mux2
ends mux4

// Cell name: mux8
subckt mux8 D0 D1 D2 D3 D4 D5 D6 D7 Q S0 S0b S1 S1b S2 S2b VDD VSS
    I0 (D0 D1 D2 D3 n0 S0 S0b S1 S1b VDD VSS) mux4
    I1 (D4 D5 D6 D7 n1 S0 S0b S1 S1b VDD VSS) mux4
    I2 (n0 n1 Q S2 S2b VDD VSS) mux2
ends mux8

// Cell name: mux16
subckt mux16 D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 Q S0 S1 S2 S3 VDD VSS
    I0 (S0 s0b VDD VSS) inv1b1s
    I1 (S1 s1b VDD VSS) inv1b1s
    I2 (S2 s2b VDD VSS) inv1b1s
    I3 (S3 s3b VDD VSS) inv1b1s
    I4 (D0 D1  D2  D3  D4  D5  D6  D7  n0 S0 s0b S1 s1b S2 s2b VDD VSS) mux8
    I5 (D8 D9  D10 D11 D12 D13 D14 D15 n1 S0 s0b S1 s1b S2 s2b VDD VSS) mux8
    I6 (n0 n1  Q   S3  s3b VDD VSS) mux2
ends mux16

// Cell name: transGateProg
subckt transGateProg A Q VDD VSS
    I0 (VSS n0 n1 VDD VSS VSS) BX
    I1 (A n0 n1 Q VDD VSS) transGate
ends transGateProg

// Cell name: muxProg2
subckt muxProg2 A B Q VDD VSS
    I0 (A Q VDD VSS) transGateProg
    I1 (B Q VDD VSS) transGateProg
ends muxProg2

// Cell name: muxProg16
subckt muxProg16 D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 Q VDD VSS
    I0  (D0  Q VDD VSS) transGateProg
    I1  (D1  Q VDD VSS) transGateProg
    I2  (D2  Q VDD VSS) transGateProg
    I3  (D3  Q VDD VSS) transGateProg
    I4  (D4  Q VDD VSS) transGateProg
    I5  (D5  Q VDD VSS) transGateProg
    I6  (D6  Q VDD VSS) transGateProg
    I7  (D7  Q VDD VSS) transGateProg
    I8  (D8  Q VDD VSS) transGateProg
    I9  (D9  Q VDD VSS) transGateProg
    I10 (D10 Q VDD VSS) transGateProg
    I11 (D11 Q VDD VSS) transGateProg
    I12 (D12 Q VDD VSS) transGateProg
    I13 (D13 Q VDD VSS) transGateProg
    I14 (D14 Q VDD VSS) transGateProg
    I15 (D15 Q VDD VSS) transGateProg
ends muxProg16

// Cell name: BX
subckt BX BL Q QB VDD VSS WL
    M0 (QB  Q  VDD VDD) pfet w=180n l=90n vthm=2 // phvt w=0.2 l=0.1 nfing=1 mult=1 srcefirst=1 mismatch=1
    M1 (QB  Q  VSS VSS) nfet w=180n l=90n vthm=2 // nhvt w=0.2 l=0.1 nfing=1 mult=1 srcefirst=1 mismatch=1
    M2 (VDD QB Q   VDD) pfet w=180n l=90n vthm=2 // phvt w=0.2 l=0.1 nfing=1 mult=1 srcefirst=1 mismatch=1
    M3 (VSS QB Q   VSS) nfet w=180n l=90n vthm=2 // nhvt w=0.2 l=0.1 nfing=1 mult=1 srcefirst=1 mismatch=1
    M4 (BL  WL QB  VSS) nfet w=180n l=90n vthm=2 // nhvt w=0.2 l=0.1 nfing=1 mult=1 srcefirst=1 mismatch=1
ends BX

// Cell name: inv1b1s
//subckt inv1b1s A Q VDD VSS
//    M0 (X A VDD VDD) pfet w=360n l=90n // psvt w=0.4 l=0.1 nfing=1 mult=1 srcefirst=1 mismatch=1
//    M1 (Q A X   VDD) pfet w=360n l=90n // psvt w=0.4 l=0.1 nfing=1 mult=1 srcefirst=1 mismatch=1
//    M2 (Q A Y   VSS) nfet w=180n l=90n // nsvt w=0.2 l=0.1 nfing=1 mult=1 srcefirst=1 mismatch=1
//    M3 (Y A VSS VSS) nfet w=180n l=90n // nsvt w=0.2 l=0.1 nfing=1 mult=1 srcefirst=1 mismatch=1
//ends inv1b1s

// Cell name: inv1b1s
subckt inv1b1s A Q VDD VSS
    M0 (Q A VDD VDD) pfet w=360n l=90n // psvt w=0.4 l=0.1 nfing=1 mult=1 srcefirst=1 mismatch=1
    M1 (Q A VSS VSS) nfet w=360n l=90n // psvt w=0.4 l=0.1 nfing=1 mult=1 srcefirst=1 mismatch=1
ends inv1b1s

// Cell name: buff8
subckt buff8 D0 D1 D2 D3 D4 D5 D6 D7 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 VDD VSS
    I0 (D0 Q0 VDD VSS) buff
    I1 (D1 Q1 VDD VSS) buff
    I2 (D3 Q3 VDD VSS) buff
    I3 (D2 Q2 VDD VSS) buff
    I4 (D6 Q6 VDD VSS) buff
    I5 (D7 Q7 VDD VSS) buff
    I6 (D5 Q5 VDD VSS) buff
    I7 (D4 Q4 VDD VSS) buff
ends buff8

// Cell name: transGate
subckt transGate A EN ENb Q VDD VSS
    M0 (A ENb Q VDD) pfet w=180n l=90n // psvt w=0.2 l=0.1 nfing=1 mult=1 srcefirst=1 mismatch=1
    M1 (A EN  Q VSS) nfet w=180n l=90n // nsvt w=0.2 l=0.1 nfing=1 mult=1 srcefirst=1 mismatch=1
ends transGate

// Cell name: buff
subckt buff A Q VDD VSS
    I0 (A  n0 VDD VSS) inv1b1s
    I1 (n0 Q  VDD VSS) inv1b1s
ends buff
